/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package transervfx.Vista.CompPersonalizado.Servicio;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;
import javafx.beans.property.ReadOnlyBooleanProperty;
import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.fxml.FXML;
import javafx.fxml.FXMLLoader;
import javafx.scene.control.Control;
import javafx.scene.control.Label;
import javafx.scene.control.TextField;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.scene.layout.AnchorPane;
import javax.validation.ConstraintViolation;
import javax.validation.Validation;
import javax.validation.Validator;
import javax.validation.ValidatorFactory;
import recursos.img.pathRecusosIMG;
import transervfx.Dato.Entidad.Domicilio;
import transervfx.Dato.Entidad.Localidad;
import transervfx.Dato.Entidad.Lugar;
import transervfx.Dato.Entidad.LugarPersonalFrecuente;
import transervfx.Dato.Entidad.Pais;
import transervfx.Dato.Entidad.Provincia;
import transervfx.Dato.Validacion.ValidacionesNivelLogico;
import transervfx.Logica.GestorPais;
import transervfx.Vista.BeanPathAdapter;
import utilidades.autocompletar.ComboBoxAutoCompletar;
import utilidades.autocompletar.TextBoxAutoCompletar;
import utilidades.number.IntegerTextField;

/**
 *
 * @author oscar
 */
public class LugarComp extends AnchorPane{

    @FXML
    private TextBoxAutoCompletar<Lugar> alias;
    final ObservableList<Lugar> dataSourceLugares = FXCollections.observableArrayList();
    @FXML
    private TextField calle;
    @FXML
    private IntegerTextField numero;
    @FXML
    private TextField departamento;
    @FXML
    private IntegerTextField piso;
    @FXML
    private ComboBoxAutoCompletar<Localidad> localidad;
    @FXML
    private ComboBoxAutoCompletar<Provincia> provincia;
    
    final static private ArrayList listVacia=new ArrayList();
  
    private Lugar lugar;
    private BeanPathAdapter<Lugar> lugarPA;
    
        
   private ValidatorFactory validatorFactory = Validation.buildDefaultValidatorFactory();
   private Validator validator = validatorFactory.getValidator();
    
    
    public LugarComp() {
        FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("LugarFXML.fxml"));
        fxmlLoader.setRoot(this);
        fxmlLoader.setController(this);

        try {
            fxmlLoader.load();
        } catch (IOException exception) {
            throw new RuntimeException(exception);
        }
           this.alias.setData(new ArrayList());
        lugar=new Domicilio();
        lugarPA=  new BeanPathAdapter<>(lugar);
        init();
    }
    
    public LugarComp(Lugar lugar,List<Lugar> lugares) {
        this();
        this.alias.setData(lugares);
        this.lugar=lugar;
        lugarPA=  new BeanPathAdapter<>(lugar);
        init();
    }

     private void init() {
         
          this.cargarPaicesProvinciasLocalidades();
          
          this.bindingInterfazConBean(lugar);
           
          this.setearEscuchadorFoco();
          
          
    
    }
     
     
     private void cargarPaicesProvinciasLocalidades() {
       Pais p=GestorPais.getInstance().paises().get(0);
       List<Provincia> prov=GestorPais.getInstance().provincias(p);
       System.out.println(provincia);
 
        provincia.setData(prov);
        


        provincia.getSelectionModel().selectedItemProperty().addListener(new ChangeListener<Provincia>() {
            @Override
            public void changed(ObservableValue<? extends Provincia> selected, Provincia oldValue, Provincia newValue) {
                if (newValue != null) {    
                    localidad.setData(GestorPais.getInstance().localidades(newValue));

                }else{
                     localidad.setData(listVacia);
                }
            }
        });

        provincia.getSelectionModel().select(0);

    }
   
    
    

    private void bindingInterfazConBean(Lugar lugar) {
           lugarPA.bindBidirectional("calle", calle.textProperty());
           lugarPA.bindBidirectional("numero", numero.numberProperty());
           lugarPA.bindBidirectional("departamento", departamento.textProperty());
           lugarPA.bindBidirectional("piso", piso.numberProperty());
          // lugarPA.bindBidirectional("localidad", localidad.valueProperty(),Localidad.class);
           
    }

    private void setearEscuchadorFoco() {
           this.calle.focusedProperty().addListener(this.escuchadorFoco);
            this.departamento.focusedProperty().addListener(this.escuchadorFoco);
            this.piso.focusedProperty().addListener(this.escuchadorFoco);
            this.numero.focusedProperty().addListener(this.escuchadorFoco);
            this.localidad.focusedProperty().addListener(this.escuchadorFoco);
    }
    
     private ChangeListener<Boolean> escuchadorFoco=new ChangeListener<Boolean>() {
            public void changed(ObservableValue<? extends Boolean> observable, Boolean oldValue, Boolean newValue) {
                //si tiene el foco
                Control control=(Control) ((ReadOnlyBooleanProperty)observable).getBean();
                if(!newValue.booleanValue()) 
                {  
                   
                 //   System.out.println("Foco viejo"+((ReadOnlyBooleanProperty)observable).getBean());
                    validar(control);

                }
            }
        };
     
     
     private boolean validar(Control control) {
          String text="";
          String nombreDelInput=control.getId();
          control.getTooltip().setText(text);
          
          if(control==this.localidad){
              this.lugar.setLocalidad(this.localidad.getValue());
          }
                
                Set<ConstraintViolation<Lugar>> errorsProperty = validator.validateProperty(this.lugar, nombreDelInput,ValidacionesNivelLogico.class);
                //retorna verdadero si no hay errores
                if(errorsProperty.isEmpty()){
       
                     control.getTooltip().setGraphic(crearImagenSuccess());
                     control.getTooltip().setText("SIN ERRORES");
                     control.setStyle("-fx-border-color: null;");
                      //System.out.println(control.getStyleClass());
                    return true;
                }
                else{
                      control.getTooltip().setGraphic(crearImagenError());
                      text="ERRORES: ";
                      control.setStyle("-fx-border-color: RED;");
                     // control.getStyleClass().clear();
                     // control.getStyleClass().add("controlError");
                for (ConstraintViolation<Lugar> lugarError : errorsProperty) {
                      text=text+"\n"+lugarError.getMessage();
                 }
                
                  control.getTooltip().setText(text);
              
                 //si no tiene errores retorna verdadero
                }
       
          
          return false;
    }
     
     
           private ImageView crearImagenSuccess() {
        Image image = new Image(pathRecusosIMG.class.getResourceAsStream("success.png"));
        
        return new ImageView(image);
    }

    private ImageView crearImagenError() {
        Image image = new Image(pathRecusosIMG.class.getResourceAsStream("error.png"));
        return new ImageView(image);
    }
    
    
    public void cambiarLugar(Lugar l){
        
        lugarPA.setBean(l);
        this.lugar=l;
        Localidad loc=l.getLocalidad();
        if(loc!=null){        
        this.provincia.getSelectionModel().select(l.getLocalidad().getProvincia());
        this.localidad.getSelectionModel().select(loc);
        }else{
           this.provincia.getSelectionModel().select(21);
           this.localidad.getSelectionModel().select(46);
        }
        this.validar();
    }
    
    public void setLugaresAlias(List<Lugar> lugares){
        this.alias.setData(lugares);
    }

    public Lugar getLugar() {
        return this.lugar;
    }

    public boolean validar() {
        return validar(this.calle) & validar(this.numero) & validar(this.departamento) & validar(this.piso) & validar(this.localidad);
    }

    public TextBoxAutoCompletar<Lugar> getAlias() {
        return alias;
    }

 

    
 

    
}
